package com.atguigu.gulimall.product;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;

/**
 * 整合Thymeleaf
 * 1、导入spring-boot-starter-thymeleaf
 * 2、配置文件spring.thymeleaf.cache: false
 * 3、把静态资源放在classpath: static ,静态页面放到templates,StringBoot，访问项目的时候默认会找index
 * 4、页面修改不重启服务器实时更新
 *      1)、引入dev-tools
 *      2)、修改完页面 controller shift f9重新自动编译当前页面，如果是代码配置，推荐重启服务
 *      
 * 6、整合redis
 * 1）、引入data-redis-starter
 * 2）、简单配置redis的host等信息
 * 3）、使用SpringBoot自动配置好的StringRedisTemplate来操作redis
 *      redis-》Map; 存放数据key，数据值val
 *      
 * 7、整合redisson作为分布式锁等功能框架
 *      1）、引入依赖
 *      https://mvnrepository.com/artifact/org.redisson/redisson
 *      <dependency>
 *          <groupId>org.redisson</groupId>
 *          <artifactId>redisson</artifactId>
 *          <version>3.25.2</version>
 *      </dependency>
 *      2）、配置redisson
 * 8、整合springCache
 *     1)、引入依赖spring-boot-starter-cache，spring-boot-starter-data-redis
 *     2)、写配置
 *          (1)、自动配置那些
 *              cacheAutoConfiguration 会导入 RedisCacheConfiguration自动配置
 *          (2)、配置使用redis作为缓存
 *              @cacheable: 触发将数据保存到缓存的操作
 *              @cacheEvict: 触发将数据从缓存删除的操作
 *              @cacheput: 不影响方法执行更新缓存
 *              @caching: 组合以上多个操作
 *              @cacheconfig: 在类级别共享缓存的相同配置
 *         开启缓存功能：@enableCaching
 *      
 * 4、Spring-Cache的不足
 *      1）、读模式
 *          缓存穿透：查询一个null数据。解决：缓存空数据；cache-null-values=true
 *          缓存击穿：大量并发进来同时查询一个正好过期的数据。解决：加锁；？默认是没有加锁的；sync = true（加锁，解决击穿）
 *          缓存雪崩：大量的key同时过期。解决：加随机时间。加上过期时间。：spring.cache.redis.time.to-live=360000
 *      2）、写模式
 *          1）、读写加锁。
 *          2）、引入Canal，感知到MySql的更新去更新缓存
 *          3）、读多写多，直接去查询数据库就行
 *    总结：
 *      常规数据（读多写少，即时性，一致性要求不高的数据）；完全可以使用Spring-Cache；写模式（只要缓存的数据有过期时间就足够了）
 *      特殊数据：特殊设计
 *   原理：
 *      CacheManager(RedisCacheManager) -> Cache(RedisCache) -> Cache负责缓存的读写
 *
 * 
 */

//@MapperScan("com.atguigu.gulimall.product.dao")

@EnableRedisHttpSession
@EnableFeignClients(basePackages = "com.atguigu.gulimall.product.feign")
@SpringBootApplication
@EnableDiscoveryClient
public class GulimallProductApplication {
    
    public static void main(String[] args) {
        SpringApplication.run(GulimallProductApplication.class, args);
    }
    
}
